package com.cskaoyan.javase.oop3._1interface._1basic;

/**
 * @description: 接口定义特点、成员特点、子类特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import javax.print.attribute.standard.PrinterURI;

/**
 * 接口的定义：
 *      接口是抽象的，是不能创建对象的，接口的声明中隐含了关键字“abstract”
 *      无需写出这个关键字，接口也是抽象的，既然隐含就不要写出来了
 * 接口的成员特点：
 *      1,成员变量
 *          接口的成员变量和普通类,抽象类有非常大的不同
 *          接口中全部都是"public static final"修饰的公共的全局常量
 *          注意:
 *              1,public是固定的,不能写别的修饰符
 *              2,static final也是固定的,不写也存在
 *              3,public static final无需写出来,所以以后接口中定义成员变量都直接写数据类型 变量名 = 值;
 *              4,接口中没有静态代码块的概念,接口的全局常量也不能用静态代码块赋值
 *              5,接口侧重描述功能的扩展,绝大多数接口中都不存在成员变量,里面全部都是方法
 *
 *
 *      2,成员方法
 *          在Java8之前,接口中没有普通实现方法,全部都是抽象方法
 *          并且抽象方法都是"public abstract"修饰的,这两个关键字不需要给出,直接省略
 *
 *          所以接口定义中,方法是可以写得很简洁的
 *          在接口中只要能够定义的成员,统统都是public修饰的,并且改不了
 *
 *          补充:
 *            在Java8以后,接口就不全是抽象方法了,接口有了默认方法和静态方法两种实现方法
 *            1,默认方法,使用default关键字
 *            语法:
 *                  default 返回值类型 方法名(){
 *                      //方法体
 *                  }
 *                  它的访问权限修饰符固定为public,不需要写出来
 *            作用和意义:
 *              抽象类中有实现方法是为了作为子类的默认实现,但是接口并不是这样的
 *              为了弥补接口设计上的缺陷,让接口的定义更加灵活,设计者才引入了接口中的默认方法
 *
 *              在实际开发中,几乎没有人会在接口中写默认方法,大家认为的接口仍然全部都是抽象方法
 *              如果在开发中滥用这个机制,就可以实现一些奇怪的功能,比如"多继承"
 *              除非时代变了,不然接口中还是仅有抽象方法,不建议在接口中使用默认方法
 *
 *             2,静态方法,使用static关键字
 *              语法:
 *                  static 返回值类型 方法名(){
 *                      //方法体
 *                  }
 *                  它的访问权限修饰符固定为public,不需要写出来
 *              它的作用和默认方法类似,但是又有所不同,静态方法更多是为了配合lambda表达式使用
 *              注意事项:
 *                  1,和类中的静态放方法能够被子类继承不同,接口中的静态方法不能被子类用,只能用接口名使用
 *                  2,接口有静态方法以后,实际上可以在接口中main方法,甚至还可以正常执行
 *
 *              以上,不管是静态方法还是默认方法,日常开发中,除非有特殊需求,否者不要滥用
 *
 *
 *      3,构造器
 *             接口既不能创建对象,又不需要给成员变量赋值,所以接口没有构造器
 *      4,代码块
 *             都没有
 *
 */
//Modifier 'abstract' is redundant for interfaces
public interface InterfaceA {


    /*//定义成员变量
    int a = 10;
    //Modifier 'private' not allowed here
    private int b;
    //Variable 'c' might not have been initialized
    //Modifier 'final' is redundant for interface fields
    final int c = 20;*/

    //public static final int A = 10;

    //接口中普遍的成员变量的定义方法
    int A = 10;
    //static {
    //
    //}

    //定义抽象方法,public abstract是隐含的,不需要写出来
    void test();

    //定义默认实现方法
    default void testDefault() {
        System.out.println("我是接口的默认实现方法");
    }

    //定义静态方法
    static void testStatic(){
        System.out.println("我是接口中的静态方法");
    }

}

interface IA {
    void test();

    int test2();

    void test3();

    double test4();

    void test5(int a);

    void test6();
}